#include "Date.h"

bool Date::operator==(const Date& d) const { return _year == d._year && _month == d._month && _day == d._day; }
bool Date::operator!=(const Date& d) const { return !(*this == d); }

bool Date::operator<(const Date& d) const 
{
    if (_year < d._year)
        return true;
    else if (_year == d._year && _month < d._month)
        return true;
    else if (_year == d._year && _month == d._month && _day < d._day)
        return true;

    return false;
}

bool Date::operator<=(const Date& d) const { return *this < d || *this == d; }
bool Date::operator>(const Date& d) const { return !(*this <= d); }
bool Date::operator>=(const Date& d) const { return !(*this < d); }

Date& Date::operator+=(int day)
{   
    if (day < 0)
        return (*this) -= (-day);

    _day += day;
    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month ++ ;
        if (_month == 13)
        {
            _year ++ ;
            _month = 1;
        }
    }

    return *this;
}

Date Date::operator+(int day)
{
    Date tmp(*this);
    tmp += day;
    return tmp;
}

Date& Date::operator-=(int day)
{
    if (day < 0)
        return (*this) += (-day);

    _day -= day;
    while (_day <= 0)
    {
        _month -- ;
        if (_month == 0)
        {
            _month = 12;
            _year -- ;
        }
        _day += GetMonthDay(_year, _month);
    }

    return *this;
}

Date Date::operator-(int day)
{
    Date tmp(*this);
    tmp -= day;
    return tmp;
}

Date& Date::operator++()
{
    *this += 1;
    return *this;
}
Date Date::operator++(int)
{
    Date tmp(*this);
    *this += 1;
    return tmp;
}
Date& Date::operator--()
{
    *this -= 1;
    return *this;
}
Date Date::operator--(int)
{
    Date tmp(*this);
    *this -= 1;
    return tmp;
}

int Date::operator-(const Date& d)
{
    Date max = *this;
    Date min = d;
    int flag = 1;

    if (max < min)
    {
        max = d;
        min = *this;
        flag = -1;
    }

    int count = 0;
    while (min != max)
    {
        count ++ ;
        min ++ ;
    }

    return count * flag;
}
